// poj3763
// 题意：给定一个n(<=100000)个节点的树，问最少加多少边使得有从1开始的哈密尔顿回路。
//
// 题解：good prob。树型dp，讨论以当前点u的子树弄成一条链，一个是以u为端点，
//       一个是以u为中间点的最少边数。这个多画几次图会有直观体会。
//       然后要注意所有子树都是中间点状态转移过来的情况。
//       假设子树有num_son个，把子树都串起来需要加num_son-1条边，然后需要
//       根据子树是端点链转移的个数来讨论边界。因为如果子树是端点链转移来的，
//       那么因为原图有边，和当前点u连接不用产生额外的边。
//
// 统计：188ms, 26min, 1a
//
// run: $exec < input
#include <cstdio>
#include <algorithm>

int const maxn = 100010;
int head[maxn], next[2 * maxn], end_point[2 * maxn];
int alloc = 1;
int f[maxn][2]; // 0: chain, current on endpoint,  1: chain, current on midpoint
int count[maxn]; // count the son of state 0
int n, ans;

void add_edge(int u, int v)
{
	end_point[alloc] = v; next[alloc] = head[u]; head[u] = alloc++;
	end_point[alloc] = u; next[alloc] = head[v]; head[v] = alloc++;
}

void dfs(int u, int par)
{
	int sum = 0, tot = 0, num_son = 0;
	for (int p = head[u]; p; p = next[p]) {
		int v = end_point[p];
		if (v == par) continue;
		dfs(v, u);
		num_son++;
		if (f[v][0] <= f[v][1]) sum += f[v][0], tot++;
		else					sum += f[v][1];
	}
	f[u][0] = f[u][1] = sum + num_son - 1;
	if (tot >= 2) f[u][1]--;
	if (!tot) f[u][1]++, f[u][0]++;
	if (u == 1) {
		ans = f[u][0] + 1;
		if (tot >= 2) ans--;
		ans = std::min(ans, f[u][1] + 1);
	}
}

int main()
{
	std::scanf("%d", &n);
	for (int i = 1, x, y; i < n; i++) {
		std::scanf("%d %d", &x, &y);
		add_edge(x, y);
	}

	dfs(1, -1);
	std::printf("%d\n", ans);
}


